//
// Created by yang on 25-4-15.
//
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct student{
    char name[50];
    int age;
    float score;
}Student;

// 定义了一个双向的结构体
typedef struct DNode{
    Student data;
    struct DNode *prior,*next;
}DNode,*DLinklist;

void InitDLinkList(DLinklist L);
void Empty(DLinklist L);





int main(){
    DLinklist L;
    //初始化
    printf("init......\n");
    InitDLinkList(&L);
    //判断是否为空
    Empty(&L);

}

//带头结点
//初始化双链表
void InitDLinkList(DLinklist L) {
    L = (DNode *)malloc(sizeof(DNode));
    if (L==NULL) {
        printf("init false\n");
    }else {
        printf("init sucess\n");
    }
    L->prior=NULL;
    L->next=NULL;
    return ;
}

//判断表是否为空
void Empty(DLinklist L) {
    if (L->next == NULL) {
        printf("is empty\n");
    }else {
        printf("no empty\n");
    }
}

//在p结点之后插入s结点
//不仅需要更换后指针还需要更换前指针
void InsertNextDNode(DNode *p,DNode *s) {
    s->next=p->next;
    //如果p是最后一个，那么会有空指针报错
    if (p->next !=NULL) {
        p->next->prior=s;
    }
    s->prior=p;
    p->next=s;
}

//删除p结点的后继结点
void DeleteNextDNode(DNode *p) {
    DLinklist s;
    s = p->next;
    if (s==NULL) {//p没有后继结点
        return ;
    }
    p->next=s->next;//先赋值再判断
    if (s->next!=NULL) {
        s->next->prior=p;
    }
    free(s);
}

//销毁链表
void DestoryList(DLinklist L) {
    //循环删除头结点后面的结点
    while (L->next!=NULL) {
        DeleteNextDNode(&L);
    }
    free(L);
    L=NULL;
}

//双链表的遍历只能遍历可以向前和向后遍历，向前如果想跳过
//头结点，可以设置一下while条件


/**
 * 循环双链表
 */

//循环双链表的初始化
void InitCircleDLinkList (DLinklist L) {
    L = (DNode *)malloc(sizeof(Student));
    L->next = L;
    L->prior =L;
}

//循环双链表相比起单链表，删除插入不用考虑如果是
//最后的一个结点